머신러닝 학습법에 대한 정리
안녕하세요 클래스메소드 김재욱(kim Jaewook)입니다!
지난 블로그「초보자도 이해할 수 있는 딥러닝(텐서플로우 설치까지)」에 이어서 이번에는 머신러닝 학습법에 대해서 정리를 해보았습니다. 딥러닝에 대해서 잘 모르겠다 하시는 분들은 위 링크를 참고해주세요!
머신러닝 학습법
전통 프로그래밍과 머신러닝의 경우 학습하는 데 있어서 차이가 있습니다.
전통 프로그래밍의 경우 데이터값과 알고리즘(예를 들어 if 또는 for)을 주고 결괏값을 찾아내는지만, 머신러닝의 경우 인풋 값(데이터값)과 아웃풋만을 가지고 어떻게 이런 결과가 나오는지 알고리즘을 유추합니다.
그래서 학습법은?
다음 그림을 보면 좀 더 쉽게 이해가 될 탠데, H(x) = wx + b 에서 w는 가중치, b는 편향치를 의미합니다. 이 가중치와 편향치를 바탕으로 H값을 구해내는 것이 핵심이라고 볼 수 있습니다.
왼쪽 그림을 보면 x값이 1일 때 y값이 1이 나옵니다. (y값은 결괏값을 의미함)
즉 x가 1일 때 y값이 1이므로 가중치는 1이고 편향치는 0이라는 것을 알 수 있습니다.
다음 그림도 위와 똑같습니다.
x가 1일 때 y값이 2로 나오게 되고 x가 2일 때 y는 4가 된다. 즉 2씩 증가하게 되는 것 입니다.
그러므로 가중치는 2가 되겠고 편향치는 0이 된다는 것을 알 수 있습니다.
또 다른 예입니다. x가 1일때 y는 3이 되고 x가 2일때 y는 4가 됩니다.
즉 가중치는 2일 것이고 편향치는 1이 될 것입니다.
이러한 계산을 바탕으로 해서 수많은 데이터 값들을 뽑아내고 가장 근접한 값을 찾아냅니다.
이것이 머신러닝의 학습법이라고 할 수 있겠습니다.
텐서(tensor)를 이용
다음은 텐서 그래프를 실행하는 과정입니다.
먼저 a에는 tf.constant(10)을 해서 10이라는 상수 값을 집어넣습니다. 여기서 constant 는 텐서 상수값을 의미합니다. b에도 마찬가지로 tf.constant(32)를 해서 32 값을 넣고 c에는 tf.add를 통해 a,b를 더한 값을 넣습니다.
이 과정이 그래프 생성하는 과정입니다.
그래프를 실행할 때는 sess.run(c)를 통해서 실행합니다,
여기서 보면 hello = tf.constant('Hello, Tensorflow!')를 print()를 했는데, Hello, Tensorflow! 라는 문자열 대신에 텐서의 형태가 출력됩니다. 이렇게 출력되는 이유는 위에 그림에서 봤던 것처럼 텐서 프로그램은 그래프 생성과 그래프 실행으로 이루어져 있기 때문입니다.
즉 그래프를 실행하기 위해서는 sess, Session을 통해서 실행을 해야 하기 때문에, sess = tf.Session()을 하고서 print(sess.run(hello))를 해야 비로소 Hello, Tensorflow!가 출력이 됩니다,
그래서 텐서는 뭔데?
텐서의 경우 여러 방향을 가진 벡터를 의미하고 머신러닝 에서는 다차원 배열을 의미합니다.
Rank, Shape, Type의 3가지 속성을 가지고 있습니다.
텐서에서의 Rank는 간단하게 말해 몇 차원 배열이냐 라는 의미인데,
- Rank 0인경우 Scalar
- Rank 1의 경우 vector
- Rank2의 경우 matrix
- Rank3의 경우 tensor
Shape의 경우 각 차원의 요소 개수를 의미하고, Type의 경우 텐서에 담긴 요소들의 자료형을 의미합니다.
다음 예제를 봅시다.
- 2번째 줄은 tensor0 = 1이 들어가 있습니다. 즉 rank0 scalar
- 3번째 줄은 1차원 배열이며 rank가1이고 vector
- 4번째 줄은 2차원 배열이며 rank가 2이고 matrix
- 5번째 줄은 3차원 배열이며 rank가3이고 tensor
결괏값을 보면 shape()이 현재 배열의 행과 열을 의미한다는 것을 알 수 있고, dtype는 배열의 데이터 타입, const는 몇 차원 배열인지 나타내는 것을 알 수 있습니다.
플레이스 홀더(placeholder)와 변수(variable)
다음은 플레이스홀더(placeholder)와 변수(variable) 입니다.
placeholder는 데이터값을 나중에 입력받기 위해 사용하는 매개변수이고, variable은 새로운 데이터 값들을 계속해서 입력받는 변수입니다.
X = tf.placeholder(tf.float32,name = 'X')라고 되어있는데, 여기서 X는 placeholder이라고 선언되어 있습니다. H(x) 에서의 x의 경우 가장 나중에 값을 알 수 있는 부분이므로 placeholder로 선언한 것입니다.
그 외에 W = tf.Variable(tf.random_uniform([1],-1.0,1.0))으로 되어있는 가중치 부분은 Variable로 되어있는데 Variable의 경우 위에 말했다시피 새로운 데이터 값들을 계속해서 입력받습니다.
앞 [1]은 1개의 데이터 값만을 받는다는 의미이며, -1.0 ~ 1.0 사이의 데이터를 랜덤하게 입력받습니다.
b = tf.Variable(tf.random_uniform([1],-1.0,1.0)) 부분도 마찬가지입니다.
텐서에서의 행렬 곱
텐서에서 행렬 곱입니다.
행렬 곱은 A x B에 대하여, 행렬 A의 열수와 행렬 B의 행수가 같아야 합니다.
행렬 곱 AxB를 계산한 행렬 AB의 크기는 A의 행 개수와 B의 열 개수가 된다.
첫 번째를 보면 abcd 의 경우 행이 2개이고, 1234의 경우 열이 2개이다 즉 AxB를 계산한 AB행렬의 크기가 4가 됩니다.
계산하는 방법은
- a*1 + b*2 a*3 + b * 4
- c*1 + d*2 c*3 + d*4
이런식으로 이루어지며, 나머지도 동일합니다.
먼저 X에는 tf.placeholder(tf.float32,[None,3])을 넣었습니다.
여기서 None의 경우 열 값은 크기를 정하지 않는다고 선언하는 것입니다.
그리고 print(X)를 해보면 shape에 ?가 출력되는 것을 볼 수 있습니다.
그리고 x_data = [[,1,2,3],[4,5,6]]을 넣어줍니다.
x_data는 placeholder에 넣을 값이며, 위에서 placeholder는 3열 행 None로 했기 때문에, x_data에 2행 3열을 넣었습니다. W 가중치의 경우 Variable(tf.random_normal([3,2])) 2행 3열의 랜덤 값을 넣었고, b의 경우에도 2행1열의 랜덤 값을 넣었습니다.
마지막으로 입력값과 변수들을 계산할 수식을 작성하는데, expr이라는 변수에 tf.matmul(X,W)+b를 통해 행렬 곱을 계산합니다.
여기서 feed_dict={X:x_data}))라고 되어 있는데, 세션에 의해 그래프가 실행되면서 X는 feed_dict에 의해서 정해진 피드 데이터 x_data를 하나씩 읽어와서 실행합니다.
x_data의 경우 2행 3열의 [1,2,3],[4,5,6]이 출력됐고, W 가중치의 경우 [3,2] 3행 2열의 랜덤 값이 출력됐습니다. b의 경우 2행 1열의 값이 랜덤하게 출력이 됐고, 마지막으로 expr의 경우 위의 값들을 행렬 곱해서 나온 값이 되겠습니다.
2행 3열의 x_data와 3행 2열의 W를 보면 2x2의 4개가 나옵니다.
위의 계산값이 맞는지 계산해보면
- 1*(-1.1455629)+(2*0.79550856)+(3*0.6839356)-0.90313035
- 1*(-0.20344591)+2*(-1.0925895)+3*(-0.19889037)-0.90313035
- 4*(-1.1455629)+(5*0.79550856)+(6*0.6839356)+0.42731205
- 5*(-0.20344591)+6*(-1.0925895)+7*(-0.19889037)+0.42731205
1.59413067 -3.88842637
3.92621685 -8.53768709
살짝 오차범위가 존재하지만, 값이 얼추 비슷하게 나오는 것을 볼 수 있습니다.
마지막으로
이번에는 머신러닝 학습법에 대해서 정리를 해보았습니다. 딥러닝, 머신러닝에 대해서 공부를 하면서 모르는 단어들이 많이 나왔는데, 하나하나 조사하면서 공부해 나가는 것도 또 하나의 재미라고 생각하면서 즐겁게 공부했습니다. 제 블로그가 도움이 될지는 모르겠지만, 머신러닝, 딥러닝을 공부하시는 분들께 조금이나마 도움이 됐으면 합니다!